/*
 * scrcpy 自定义通用的定义
 * */
#ifndef SC_COMMON_H
#define SC_COMMON_H

/* 
config.h 是由meson自动生成的，路径类似：scrcpy/x/app/config.h 
x 是编译时的生成路径，meson的命令中会频繁用到
*/
#include "config.h"
#include "compat.h"

/* 计算数组的长度，即可容纳的元素个数 */
#define ARRAY_LEN(a) (sizeof(a) / sizeof(a[0]))

/* 求两个数的最小值.没有将宏体用括号再次括起来，这样定义有安全隐患.不能直接用在复合表达式中 */
#define MIN(X,Y) ((X) < (Y) ? (X) : (Y))

/* 求两个数的最大值. */
#define MAX(X,Y) ((X) > (Y) ? (X) : (Y))

/* 求三个数中的中间的那个 。 clamp 夹住，夹具 */
#define CLAMP(V,X,Y) MIN( MAX((V),(X)), (Y) )

/*
container_of在Linux内核中是一个常用的宏，用于从包含在某个结构中的指针获得结构本身的指针，
通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址。
下面的定义与网上流传的不一样，网上的那个编译不通过，这个更简单一些。
@param ptr 结构中某个属性的指针
@param type 结构类型
@param member 对应指针的属性名称
*/
#define container_of(ptr, type, member) \
    ((type *) (((char *) (ptr)) - offsetof(type, member)))

#endif
